/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package client;

import java.io.*;
import java.lang.*;
import java.util.*;
import java.net.*;

/**
 *
 * @author seb
 */
public class Connection extends Thread {

    private static final int CONNECTION = 0;
    private static final int DECONNECTION = 1;
    private static final int MESSAGE = 2;
    private static final int ERROR = 3;
    /**
     * dans ce thread, on control les flux d'entree et de sortie
     */
    private String idConnection;
    private DataOutputStream sortie;
    private DataInputStream entree;
    private ChatView client;
    private boolean alive;

    public Connection(ChatView client, String id, DataOutputStream sortie, DataInputStream entree) {
        this.idConnection = id;
        this.sortie = sortie;
        this.entree = entree;
        this.client = client;

        Message mess = new Message(MESSAGE, "server", "systemPanel", "La connexion est OK");
        mess.sendMessage(sortie);
        System.out.println("Connection de : " + id);
        alive = true;
    }

    /*
     * Previens le serveur de la deconnection par un message de type DECONNECTION
     * L'ecrit sur le sytemPanel du client
     * fermeture du thread en passant le alive a faux (boucle while)
     * fermeture des flux d'entree sortie
     * renvois vrai si tout est bon
     */
    public boolean closeConnection() {
        try {
            Message mess = new Message(DECONNECTION, idConnection, "systemPanel", "You are deconnected");
            mess.sendMessage(sortie);
            client.writeMessageTab(mess);
            entree.close();
            sortie.close();
            alive = false;
            return true;
        } catch (Exception ex) {
            return false;
        }
    }

    /*
     * reception les messages du flux entrant et les transmé a la gestion des tabs
     */
    public void run() {
        while (alive) {
            try {
                receiveMessage();
                try {
                    sleep(50);
                } catch (InterruptedException e) {
                }
            } catch (Exception ex) {
                if (alive == true) {
                    client.closeConnection();
                }
            }
        }
    }

    public void receiveMessage() {
        Message mess = new Message();
        mess.readMessage(entree);
        /**
         * Redirection du message dans le tab associer au destinataire du message
         */
        client.writeMessageTab(mess);
    }

    public void sendMessage(String s) {
        try {
            Message mess = new Message(MESSAGE, idConnection, idConnection, s);
            mess.sendMessage(sortie);
        } catch (Exception e) {
            System.out.println("error " + e.toString());
        }
    }
}
